package com.ssd.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ssd.constant.Constants;
import com.ssd.mapper.PayChannelMapper;
import com.ssd.model.domain.PayChannel;
import com.ssd.model.dto.PayChannelDTO;
import com.ssd.service.PayChannelService;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;

/**
 * @author itcast
 * @Description： 支付通道服务类
 */
@Service
public class PayChannelServiceImpl extends ServiceImpl<PayChannelMapper, PayChannel> implements PayChannelService {

    /**
     * 根据查询条件分页获取支付渠道列表
     *
     * @param payChannelDTO 查询条件封装对象，包含渠道标签、渠道名称、启用标志等条件
     * @param pageNum       当前页码，用于分页查询
     * @param pageSize      每页记录数，用于分页查询
     * @return 返回支付渠道的分页列表
     */
    @Override
    public Page<PayChannel> findPayChannelPage(PayChannelDTO payChannelDTO, int pageNum, int pageSize) {
        // 初始化分页对象
        Page<PayChannel> page = new Page<>(pageNum, pageSize);
        // 初始化查询条件包装器
        LambdaQueryWrapper<PayChannel> queryWrapper = new LambdaQueryWrapper<>();

        // 设置查询条件
        // 根据渠道标签查询，如果标签非空
        queryWrapper.eq(StrUtil.isNotEmpty(payChannelDTO.getChannelLabel()), PayChannel::getChannelLabel, payChannelDTO.getChannelLabel());
        // 根据渠道名称模糊查询，如果名称非空
        queryWrapper.likeRight(StrUtil.isNotEmpty(payChannelDTO.getChannelName()), PayChannel::getChannelName, payChannelDTO.getChannelName());
        // 根据启用标志查询，如果启用标志非空
        queryWrapper.eq(StrUtil.isNotEmpty(payChannelDTO.getEnableFlag()), PayChannel::getEnableFlag, payChannelDTO.getEnableFlag());
        // 设置排序条件
        // 根据创建时间升序排序
        queryWrapper.orderByAsc(PayChannel::getCreateTime);

        // 执行分页查询并返回结果
        return super.page(page, queryWrapper);
    }

    /**
     * 根据企业ID和渠道标识查找支付渠道
     *
     * @param enterpriseId 企业ID，用于定位特定企业
     * @param channelLabel 渠道标识，用于区分不同的支付渠道
     * @return 返回匹配的支付渠道对象，如果不存在则返回null
     */
    @Override
    public PayChannel findByEnterpriseId(Long enterpriseId, String channelLabel) {
        // 创建一个Lambda查询包装器，用于构建查询条件
        LambdaQueryWrapper<PayChannel> queryWrapper = new LambdaQueryWrapper<>();
        // 设置查询条件：企业ID等于传入的企业ID
        queryWrapper.eq(PayChannel::getEnterpriseId, enterpriseId)
                // 设置查询条件：渠道标识等于传入的渠道标识
                .eq(PayChannel::getChannelLabel, channelLabel)
                // 设置查询条件：启用标志为是，表示该支付渠道是启用状态
                .eq(PayChannel::getEnableFlag, Constants.YES);
        // 调用父类方法，根据查询条件获取一个支付渠道对象
        return super.getOne(queryWrapper);
    }

    /**
     * 创建支付渠道
     *
     * 本方法通过将支付渠道的DTO转换为支付渠道实体，并尝试保存到数据库
     * 如果保存成功，则返回新创建的支付渠道对象；如果保存失败，则返回null
     *
     * @param payChannelDTO 支付渠道的DTO对象，包含创建支付渠道所需的信息
     * @return 如果支付渠道成功创建并保存，则返回支付渠道对象；否则返回null
     */
    @Override
    public PayChannel createPayChannel(PayChannelDTO payChannelDTO) {
        // 将支付渠道DTO转换为支付渠道实体对象
        PayChannel payChannel = BeanUtil.toBean(payChannelDTO, PayChannel.class);

        // 尝试保存支付渠道实体对象
        boolean flag = super.save(payChannel);

        // 根据保存结果决定返回值
        if (flag) {
            return payChannel;
        }
        return null;
    }

    /**
     * 更新支付渠道信息
     *
     * 该方法接收一个PayChannelDTO对象作为参数，将其转换为PayChannel对象，并调用父类的更新方法
     * 以此来更新数据库中对应的支付渠道信息
     *
     * @param payChannelDTO 支付渠道的DTO对象，包含了需要更新的支付渠道信息
     * @return 返回一个Boolean对象，表示更新操作是否成功
     */
    @Override
    public Boolean updatePayChannel(PayChannelDTO payChannelDTO) {
        // 将PayChannelDTO对象转换为PayChannel对象
        PayChannel payChannel = BeanUtil.toBean(payChannelDTO, PayChannel.class);
        // 调用父类的更新方法，更新支付渠道信息
        return super.updateById(payChannel);
    }

    /**
     * 重写删除支付渠道的方法
     *
     * @param checkedIds 要删除的支付渠道ID数组
     * @return 删除操作是否成功的布尔值
     */
    @Override
    public Boolean deletePayChannel(String[] checkedIds) {
        // 将数组转换为列表，以便使用removeByIds方法
        List<String> ids = Arrays.asList(checkedIds);
        // 调用父类的removeByIds方法，传入ID列表，返回删除操作的结果
        return super.removeByIds(ids);
    }

    /**
     * 根据渠道标识查找支付渠道列表
     * 此方法用于查询特定渠道标识的支付渠道，且仅限于启用状态的渠道
     *
     * @param channelLabel 渠道标识，用于筛选特定的支付渠道
     * @return 返回一个支付渠道列表，这些渠道具有相同的渠道标识并且是启用状态的
     */
    @Override
    public List<PayChannel> findPayChannelList(String channelLabel) {
        // 创建一个Lambda查询包装器，用于构建查询条件
        LambdaQueryWrapper<PayChannel> queryWrapper = new LambdaQueryWrapper<>();
        // 设置查询条件：渠道标识等于输入的渠道标识且启用标志为“是”
        queryWrapper.eq(PayChannel::getChannelLabel, channelLabel)
                .eq(PayChannel::getEnableFlag, Constants.YES);
        // 执行查询并返回结果列表
        return list(queryWrapper);
    }
}
